/*
* 变量，常量的定义
*/

//当前包的名称
package main

//fmt包包含了格式输入输出
import "fmt"

/*
* 全局变量的定义
* 定义过的全局变量可以不用，但是定义的局部变量必须使用。
* 如果全局变量或者全局函数的首字母是大写的，那么当其他包导入当前包时，
* 这些首字母大写的全局名称可以在其他包内使用，否则不能在其他包内使用。
* 此外，定义的全局变量，都可以在同一个包内使用，即便它们定义在不同的文件中。
*/

/*
* 最标准的定义方式
* var 变量名称 变量类型 = 值
*/
var intValue1_g int = 1

//变量类型可以省略，编译器可以自动推断类型
var intValue2_g = 10
var stringValue1_g = "string1"
var boolValue1_g = true

//全局变量不能使用:=来直接定义
//函数内的局部变量可以使用:=来快速定义
//intValue1 := 11

//可以同时定义多个变量
var intValue3_g, intValue4_g = 13, 14
var intValue5_g, stringValue2_g = 15, "string2"

//可以使用括号来同时定义多个变量
var (
	intValue6_g = 15
	stringValue3_g = "string2"
)

//变量名首字母大写，对包外可见
var IntValue1_g = 101

//枚举类型
//使用iota时，后续变量/常量的定义将套用iota的公式
const (
	//iota为自增变量，初始为0
	enum1 = iota //等效于enum1=0
	enum2        //等效于enum2=1
	enum3        //等效于enum3=2
	_            //使用下划线跳过本次自增变量的值
	enum4        //等效于enum4=4
)

//常量的定义
//定义常量时如果不指定类型，使用时是简单的字符串替换，类似于C中的#define
//定义常量时如果指定了类型，那么该常量只能作为该种类型来使用，与C中的const类似
//常量通常全部大写
const constValue1, constValue2 = 21, 22
const constValue3, constValue4 int = 23, 24

//内建变量类型包括
//rune类似于C中的char，只是它支持UTF-8编码
//bool string
//int uint int8 uint8 int16 uint16 int32 uint32 int64 uint64 uintptr
//byte rune(字符类型，32位)
//float32 float64 complex64 complex128

func VariableTest(){
	//函数内部的变量可以使用:=快速定义
	value1, value2 := 21, "value2"
	//函数内部定义的变量必须使用
	fmt.Println(value1, value2)
}